package com.buddy.learn.algorithm.demo;

import java.util.BitSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @author Buddy
 * @date 2021/5/6
 */
public class _010字符个数统计 {

    /**
     * 编写一个函数，计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)，换行表示结束符，不算在字符里。
     * 不在范围内的不作统计。多个相同的字符只计算一次
     * 例如，对于字符串abaca而言，有a、b、c三种不同的字符，因此输出3。
     */
    public static void main(String[] args) {
        //凡是涉及到去重统计都可以用位图实现。因为每一个不同的数据只需要用二进制的一位存储即可，大大减小了统计所使用的存储空间
        Scanner scanner = new Scanner(System.in);
        String line = scanner.next();
        //总共有128个字符。字需要用128位
        BitSet bitSet = new BitSet(128);
        char[] chars = line.toCharArray();
        for (char c : chars) {
            //判断字符c是否已出现
            if (!bitSet.get(c)) {
                //未出现就设置为已出现
                bitSet.set(c);
            }
        }
        //统计有多少字符已出现过
        System.out.println(bitSet.cardinality());
    }

    public static void main2(String[] agrs) {
        Scanner in = new Scanner(System.in);
        String input = in.nextLine();
        Map<Character, Object> map = new HashMap<>();
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (0 < c && c < 127) {
                map.put(c, new Object());
            }
        }
        System.out.println(map.size());
    }
}
